package com.leetcode.operator;

/**
 * 计算机中 1/0 真/假 电气 开/关 闭合/打开
 * 逻辑运算符都是转化为二进制进行计算后再得到十进制数字
 *
 * @author fangzhe.hou 2019-11-8 15:56:26
 */
public class OperatorTest1 {

    public static void main(String[] args) {
        // ^ 异或，即为不同的真，其运算规则为1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0 相同得0不同得1
        System.out.println("^-----------------------");
        // 1 0001 2 0010 -> 3 0011
        System.out.println(1 ^ 2);
        System.out.println(2 ^ 2);
        System.out.println(2 ^ 0);

        // & 位与，真真为真，一个为假即为假假 1&1 = 1
        System.out.println("&-----------------------");
        // 1 0001 2 0010 -> 0 0000
        System.out.println(1 & 2);
        System.out.println(2 & 0);
        System.out.println(2 & 2);

        // | 位或，一个为真即为真，全假为假，0|0=0
        System.out.println("|-----------------------");
        // 1 0001 2 0010 -> 3 0011
        System.out.println(1 | 2);
        System.out.println(2 | 0);
        System.out.println(2 | 2);

        System.out.println("正数左边第一位补0，负数补1");
        // << 左移运算符，5<<2，在5的二进制的右边位上加2个0，整体左移两位
        System.out.println("<<-----------------------");
        // 5 0000 0101 -> 0000 0101 00 -> 20 0001 0100 左边数*2的N次方，但是N有范围要求不可以太大
        System.out.println(5 << 2);
        System.out.println(-5 << 2);

        // >> 右移运算符, 5>>2，在5的二进制的左边位上加2个0，整体右移两位
        System.out.println(">>-----------------------");
        // 5 0000 0101 -> 00 0000 0101 -> 1 0000 0001 等于除于2的n次方
        System.out.println(5 >> 2);
        System.out.println(-5 >> 2);

        // ~ 取反运算符 取反就是1为0,0为1,5的二进制位是0000 0101，取反后为1111 1010，值为-6
        System.out.println("~-----------------------");
        System.out.println(~5);
        // 0001 1110
        System.out.println(~1);
        // 0010 1101
        System.out.println(~2);

        // >>> 无符号右移运算符
        System.out.println(">>>-----------------------");
        // 5 0000 0101
        System.out.println(5 >>> 2);
        System.out.println(-5 >>> 2);
    }
}